package com.itheima.health.service.impl;

import com.itheima.health.common.RedisConst;
import com.itheima.health.service.SmsService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import sun.rmi.runtime.Log;

import java.security.SecureRandom;
import java.util.concurrent.TimeUnit;

@DubboService
@Slf4j
public class SmsServiceImpl implements SmsService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * @Author: 15041
     * @Date: 17:09 2021/1/12
     * @Parms: [type, telephone]
     * @ReturnType: void
     * Description: 发送短信验证码
     */
    @Override
    public void sendValidateCode(String type, String telephone) {
        //生成验证码 生成一个1000 ~ 9999的验证码
        int code = (int) (1000 + new SecureRandom().nextDouble() * 8999);
        //将验证码保存到redis中 保存五分钟 格式为key/value  前缀+验证码类型+手机号/验证码
        String redisKey = RedisConst.VALIDATA_CODE_PREFILX + type + telephone;
        //将验证码根据key存到redis中 存在 5 * 60 秒
        redisTemplate.boundValueOps(redisKey).set(String.valueOf(code),5*60L, TimeUnit.SECONDS);
        log.info("验证码发送-code：{}，telephone：{}，type：{}",code,telephone,type);
    }

    @Override
    public boolean checkValidateCode(String type, String telephone, String code) {
        log.info("验证码-校验 code：{}，telephone：{}，type：{}",code,telephone,type);
        //根据key从redis中获取验证码 key = 前缀 + 验证码类型 + 手机号
        String redisKey = RedisConst.VALIDATA_CODE_PREFILX+type+telephone;
        //根据key获取value
        String redisCode = (String)redisTemplate.boundValueOps(redisKey).get();
        //判断 redis 中的验证码不为空 并且 和 前端传递过来的验证码相同的话就返回true
        if (StringUtils.isNotEmpty(redisCode)&&redisCode.equals(code)){
            return true;
        }
        return false;
    }
}
